#include "pch.h"
#include "DBSCAN.h"
//#include <numeric>
//#include "Utility.h"
//bool inside(std::vector<std::vector<unsigned int>> vvs,unsigned int v) {
//	for (const auto& vs : vvs)
//	{
//		if (std::find(vs.begin(), vs.end(), v) != vs.end())
//			return true;
//	}
//	return false;
//}
//
//std::vector<std::vector<unsigned int>> DBSCAN::fit(const EVec& points)
//{
//	KdTree kdtree(points,8);
//	
//	RadiusResult radius(_para._radius);
//	std::unordered_set<unsigned int> indexs;
//	indexs.reserve(points.size());
//	for (int i = 0; i < points.size(); i++)
//		indexs.insert(i);
//
//	int res_size = 0;
//	std::vector<std::vector<unsigned int>> res;
//	while (res_size != points.size()) {
//		auto p = points[*(indexs.begin())];
//		findPoints(points, *indexs.begin(), kdtree, res);
//		for (const auto& val : *(res.end() - 1))
//		{
//			auto find_res = indexs.find(val);
//			if (find_res != indexs.end())
//				indexs.erase(find_res);
//		}
//		res_size = 0;
//		for (const auto& each : res)
//			res_size += each.size();
//	}
//
//	return res;
//}
//
//void DBSCAN::findPoints(
//	const DBSCAN::EVec& points,
//	int search_point,
//	KdTree& kdTree,
//	std::vector<std::vector<unsigned int>>& res)
//{
//	res.emplace_back();
//	std::unordered_set<unsigned int> search_points;
//
//	search_points.insert(search_point);
//	RadiusResult radius(_para._radius);
//	while (!search_points.empty()) {
//		auto begin = search_points.begin();
//		_res.insert(*begin);
//		if (inside(res, *begin))
//		{
//			(res.end() - 1)->push_back(*begin);
//			search_points.erase(begin);
//			continue;
//		}
//
//		(res.end() - 1)->push_back(*begin);
//
//		kdTree.RadiusSearch(points[*begin], radius);
//		for (const auto& p : radius.getResult())
//		{
//			if(_res.find(p.second) == _res.end())
//				search_points.insert(p.second);
//		}
//		search_points.erase(begin);
//	}
//}
